🍃
🌿
🍀
第5章 · 5.2 MySQL数据表管理(续)

修改 · 删除 · 查看数据表

掌握 ALTER TABLE 的六大武器、DROP TABLE 的安全删除,以及 DESC / SHOW CREATE TABLE 的结构查看

3

修改数据表(ALTER TABLE)

💡 通俗理解
创建好一张表就像装修好一栋房子。但住进去以后,你可能想加一间房(ADD)、换个门牌号(RENAME)、改房间名(CHANGE)、换家具尺寸(MODIFY)、换供暖系统(ENGINE)、拆掉一间房(DROP)。ALTER TABLE 就是你的"装修工具箱"。

ALTER TABLE 有 6 种常用操作,每种对应一个关键字:

ADD 加字段/约束

给表增加新字段或新的完整性约束。可以用 FIRSTAFTER 指定位置。

RENAME 改表名

把整张表的名字改掉。结构和数据完全不变。

CHANGE 改字段名

同时修改字段名和数据类型。即使不改类型,也必须写上数据类型

MODIFY 改类型/顺序

修改字段的数据类型,或用 FIRST / AFTER 调整字段排列顺序。

ENGINE 换存储引擎

切换 InnoDB ↔ MyISAM 等。注意有外键的表不能改为 MyISAM。

DROP 删字段/约束

删除已有的字段或完整性约束。删除字段会同时删除该列所有数据

➕ ADD——增加字段和约束
ALTER TABLE <表名> ADD [<新字段名> <数据类型>] [<完整性约束>] [FIRST | AFTER <已有字段名>];

示例1:在学生表 s 中增加一个字段"班号"class_no

ALTER TABLE s ADD class_no VARCHAR(6);

示例2:同时增加多个字段——班号和住址

ALTER TABLE s ADD (class_no VARCHAR(6), address NVARCHAR(20));
!
添加多个字段时必须用小括号括起来,且不能指定 FIRST / AFTER 位置,只能添加到表末尾。

示例3:给已有字段增加 NOT NULL 约束(语法不同!)

ALTER TABLE <表名> CHANGE [COLUMN] <字段名> <字段名> <数据类型> NOT NULL; -- 例如:给 s 表的 age 字段加 NOT NULL ALTER TABLE s CHANGE age age INT NOT NULL;
i
增加 NOT NULL 约束不用 ADD,而是通过 CHANGE 重新定义字段来实现。
🏷️ RENAME——修改表名
ALTER TABLE <旧表名> RENAME [TO] <新表名>;
ALTER TABLE s RENAME student;
修改表名不影响表结构和表中数据,只是换了个名字。
✏️ CHANGE——修改字段名
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
ALTER TABLE s CHANGE sn sname VARCHAR(45);
⚠️ 易错点
即使你不想修改数据类型,<新数据类型> 也不能省略!只需要写成和原来一样的类型即可。少写这一项是初学者最常见的语法错误。
🔄 MODIFY——修改字段类型和排序
ALTER TABLE <表名> MODIFY <字段名1> <数据类型> [FIRST | AFTER <字段名2>];

示例1:修改数据类型——把 sn 从 VARCHAR(45) 改为 CHAR(30)

ALTER TABLE s MODIFY sn CHAR(30);

示例2:调整字段顺序——把 sn 移到第一位

ALTER TABLE s MODIFY sn CHAR(30) FIRST;
!
调整字段排序时,数据类型不可省略——FIRST 和 AFTER 后面必须带上完整的类型声明。

CHANGE vs MODIFY 对比

对比项CHANGEMODIFY
能改字段名? ✅ 可以 ❌ 不行
能改数据类型? ✅ 可以 ✅ 可以
能调字段顺序? ❌ 不行 ✅ FIRST / AFTER
一句话记忆 改名字用我 改类型、调顺序用我
⚙️ ENGINE——修改存储引擎
ALTER TABLE <表名> ENGINE= <新存储引擎名>;
ALTER TABLE s ENGINE=MyISAM;
!
如果表有外键约束,不能从 InnoDB 改为 MyISAM——因为 MyISAM 不支持外键
🗑️ DROP——删除字段和约束

删除字段:

ALTER TABLE <表名> DROP <字段名>;
ALTER TABLE s DROP class_no, DROP address;

删除约束:

ALTER TABLE <表名> DROP CONSTRAINT <约束名>;
ALTER TABLE s DROP CONSTRAINT s_chk;
!
删除多个字段时,每个字段前都要写 DROP,用逗号隔开。
🤔 等一下——约束名从哪来?
刚才写 DROP CONSTRAINT s_chk,这个 s_chk 是怎么来的?我怎么知道约束叫什么名字?
有两种情况:你自己起的名字,或者 MySQL 自动生成的名字

情况一:建表时用 CONSTRAINT 自己起名

CREATE TABLE sc_named ( sno CHAR(10) NOT NULL, cno CHAR(10) NOT NULL, score DECIMAL(5,2), PRIMARY KEY (sno, cno), CONSTRAINT fk_sc_sno FOREIGN KEY (sno) REFERENCES s(sno), CONSTRAINT fk_sc_cno FOREIGN KEY (cno) REFERENCES c(cno), CONSTRAINT chk_score CHECK(score >= 0 AND score <= 100) ) ENGINE=InnoDB;
CONSTRAINT 约束名 写在约束关键字前面。这样以后删约束就直接用这个名字,非常方便。建议养成命名习惯!

情况二:没起名?用 SHOW CREATE TABLE 查出来

如果建表时偷懒没写 CONSTRAINT,MySQL 会自动生成一个名字。用这条命令就能查到:

SHOW CREATE TABLE sc_check;
CREATE TABLE `sc_check` ( `sno` char(10) NOT NULL, `cno` char(10) NOT NULL, `score` decimal(5,2) DEFAULT NULL, PRIMARY KEY (`sno`,`cno`), CONSTRAINT sc_check_chk_1 CHECK ((`score` >= 0) and (`score` <= 100)) ) ENGINE=InnoDB
!
看到高亮的 sc_check_chk_1 了吗?这就是 MySQL 自动生成的约束名。删约束时用它!

第二步:用查到的名字删除约束

-- 用刚才查到的自动生成名字 ALTER TABLE sc_check DROP CONSTRAINT sc_check_chk_1;
-- 如果外键自己命名了 fk_sc_sno ALTER TABLE sc_named DROP FOREIGN KEY fk_sc_sno;

完整流程:三步走

📝
建表时
CONSTRAINT 起名
🔍
忘了名字?
SHOW CREATE TABLE
🗑️
删除约束
DROP CONSTRAINT 名

各类约束的删除语法

约束类型删除语法示例
CHECK DROP CONSTRAINT 约束名 DROP CONSTRAINT sc_check_chk_1
FOREIGN KEY DROP FOREIGN KEY 约束名 DROP FOREIGN KEY fk_sc_sno
UNIQUE DROP INDEX 索引名 DROP INDEX sn
PRIMARY KEY DROP PRIMARY KEY 不需要名字(一张表只有一个主键)

ALTER TABLE 六大操作速查表

操作关键字一句话说明示例
增加字段 ADD 加新列到表中 ADD class_no VARCHAR(6)
改表名 RENAME 换个名字,数据不变 RENAME student
改字段名 CHANGE 改名 + 改类型 CHANGE sn sname VARCHAR(45)
改字段类型/顺序 MODIFY 改类型或移位 MODIFY sn CHAR(30) FIRST
换引擎 ENGINE 切换存储引擎 ENGINE=MyISAM
删字段/约束 DROP 移除列或约束 DROP class_no
4

删除数据表(DROP TABLE)

💡 通俗理解
DROP TABLE 就像把一栋楼整栋拆除——不是清空里面的家具(那叫 DELETE),也不是推倒重建(那叫 TRUNCATE),而是连地基一起铲掉,表结构 + 数据 + 索引全部消失。
⚠️ 危险操作
DROP TABLE 是不可逆的!执行后表的结构和数据都会永久删除,无法恢复(除非有备份)。在生产环境中务必三思而后行
DROP TABLE [IF EXISTS] <表名>;
DROP TABLE IF EXISTS s;
加上 IF EXISTS 可以避免删除不存在的表时报错——是一种"安全写法"。
!
如果有外键引用了该表,需要先删除引用它的从表,或者先删除外键约束,才能删除该表。

三种"删除"的区别——初学者最容易搞混!

操作删什么?表还在吗?能回滚吗?生活类比
DROP TABLE 结构 + 数据 + 索引,全部删除 ❌ 表消失了 ❌ 不可回滚 拆房子
DELETE FROM 只删数据(可加 WHERE 条件) ✅ 表结构保留 ✅ 可回滚 搬走家具
TRUNCATE TABLE 清空所有数据(不可加条件) ✅ 表结构保留 ❌ 不可回滚 一键清空房间
🏠
DROP
拆掉整栋楼
📦
DELETE
搬走部分家具
🧹
TRUNCATE
清空所有家具
5

查看数据表

💡 通俗理解
建完表以后,你想知道"我数据库里有哪些表?"和"这张表长什么样?"。MySQL 提供了三个"查看命令"帮你完成这件事。
📋 SHOW TABLES——查看所有表

列出当前数据库中所有已创建的表

SHOW TABLES;
USE teaching; SHOW TABLES;
+---------------------+ | Tables_in_teaching | +---------------------+ | c | | s | | sc | | t | | tc | +---------------------+ 5 rows in set (0.00 sec)
🔍 DESCRIBE / DESC——查看表字段信息

查看表的每个字段的名称、类型、是否允许 NULL、键、默认值等信息。

DESCRIBE <表名>; -- 等价简写 DESC <表名>;
DESC s;
+-------+-----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------------------+------+-----+---------+-------+ | sno | char(10) | NO | PRI | NULL | | | sn | varchar(45) | NO | | NULL | | | sex | enum('男','女') | NO | | 男 | | | age | int | NO | | NULL | | | maj | varchar(45) | NO | | NULL | | | dept | varchar(45) | NO | | NULL | | +-------+-----------------------+------+-----+---------+-------+

输出字段含义:

字段含义常见值
Field 字段名 sno, sn, age ...
Type 数据类型 char(10), int, varchar(45) ...
Null 是否允许 NULL YES / NO
Key 键/索引 PRI(主键)、UNI(唯一)、MUL(外键/非唯一索引)
Default 默认值 NULL、'男' 等
Extra 额外信息 auto_increment 等
📜 SHOW CREATE TABLE——查看建表语句

查看创建这张表时的完整 SQL 语句,包括约束、引擎、字符集等全部细节。这在需要复制/备份表结构时特别有用。

SHOW CREATE TABLE <表名>;
SHOW CREATE TABLE s;
CREATE TABLE `s` ( `sno` char(10) NOT NULL COMMENT '学号', `sn` varchar(45) NOT NULL COMMENT '姓名', `sex` enum('男','女') NOT NULL DEFAULT '男' COMMENT '性别', `age` int NOT NULL COMMENT '年龄', `maj` varchar(45) NOT NULL COMMENT '专业', `dept` varchar(45) NOT NULL COMMENT '院系', PRIMARY KEY (`sno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
DESC 适合快速查看字段信息SHOW CREATE TABLE 适合完整复原建表语句
i
复制 SHOW CREATE TABLE 的输出,稍作修改(如换个表名),就能快速建一张结构相同的新表。
📊 SELECT——查看表中数据(预告)

想查看表里存的数据,用 SELECT 语句。最简单的写法是查看所有数据

SELECT * FROM <表名>;
SELECT * FROM s;
i
SELECT 的完整用法将在后续"数据查询"章节详细讲解,这里先了解最基本的 SELECT * 即可。

三条查看命令速查表

命令看什么?用途
SHOW TABLES 当前数据库中有哪些表 确认表是否已创建
DESC 表名 表的字段名、类型、约束 快速了解表结构
SHOW CREATE TABLE 表名 完整的建表语句 复制/备份表结构

命令全景对比——学完了,回头看全貌

💡 这一节干嘛的?
前面学了十几条命令,容易"只见树木不见森林"。这里把所有命令按用途分类对比,帮你建立整体认知——遇到任务时知道该用哪条命令。

数据表的"一生"——从创建到删除的完整生命周期

🏗️
创建
CREATE TABLE
🔧
修改
ALTER TABLE
👀
查看
DESC / SHOW
🗑️
删除
DROP TABLE

全部命令速查:遇到问题 → 查这张表

分类我想做什么?用哪条命令示例
创建 新建一张表 CREATE TABLE CREATE TABLE s (...)
给字段加约束 CONSTRAINT ... CHECK / FOREIGN KEY CONSTRAINT chk CHECK(age>0)
修改 加新字段 ALTER TABLE ... ADD ADD phone VARCHAR(20)
改表名 ALTER TABLE ... RENAME RENAME student
改字段名 ALTER TABLE ... CHANGE CHANGE sn sname VARCHAR(45)
改字段类型 / 调顺序 ALTER TABLE ... MODIFY MODIFY sn CHAR(30) FIRST
换存储引擎 ALTER TABLE ... ENGINE= ENGINE=MyISAM
删字段 / 删约束 ALTER TABLE ... DROP DROP class_no
查看 看有哪些表 SHOW TABLES SHOW TABLES;
看表的字段信息 DESC 表名 DESC s;
看完整建表语句 SHOW CREATE TABLE 表名 SHOW CREATE TABLE s;
删除 删除整张表 DROP TABLE [IF EXISTS] DROP TABLE IF EXISTS s;
清空表中所有数据 TRUNCATE TABLE TRUNCATE TABLE s;
删除部分数据 DELETE FROM ... WHERE DELETE FROM s WHERE sno='s1';

容易混淆的命令对比

对比组命令 A命令 B核心区别
改名 vs 改类型 CHANGE MODIFY CHANGE 能改字段名,MODIFY 能调字段顺序
拆房 vs 搬家具 vs 清空 DROP TABLE DELETE / TRUNCATE DROP 删表+数据;DELETE 只删数据可回滚;TRUNCATE 清空不可回滚
快速看 vs 完整看 DESC SHOW CREATE TABLE DESC 看字段列表;SHOW CREATE TABLE 看完整建表语句
改表名 vs 改字段名 RENAME CHANGE RENAME 改表名(整张表);CHANGE 改字段名(某一列)
记忆口诀:建用 CREATE,改用 ALTER,看用 DESC / SHOW,删用 DROP。ALTER 里面六个词:ADD 加、RENAME 换名、CHANGE 改列名、MODIFY 改类型、ENGINE 换引擎、DROP 删。